package com.study.d016event;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import javax.imageio.ImageWriter;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderStroke;
import javafx.scene.layout.BorderStrokeStyle;
import javafx.scene.layout.BorderWidths;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
import javafx.scene.text.Text;
import javafx.stage.Stage;

/**
*@description 拖拽文本 和 拖拽文件
*拖拽文本：
*		第一步：使用检测事件：setOnDragDetected()，  startDragAndDrop方法不能少；
*		第二步：使用拖拽划过事件：setOnDragOver()
*		第三步：拖拽完成松手后：setOnDragDropped()
*		第四步：动作完成setOnDragDone()
*
*@author xtayhame
*date 2020年3月8日
*version
*since v1.0
*/
public class DragTextMain extends Application{
	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage stage) throws Exception {
		AnchorPane anchorPane = new AnchorPane();
		Label label = new Label("文字拖拽");
		TextField tf = new TextField();

		HBox hBox = new HBox(100);
		hBox.getChildren().addAll(label,tf);

		HBox hBox2 = new HBox();
		ImageView  view = new ImageView();
		view.setFitHeight(300);
		view.setFitWidth(300);

		view.setPreserveRatio(true); //设置缩放
		hBox2.getChildren().add(view);
		hBox2.setStyle("-fx-background-color:#55ff55");

		//view.setImage(new Image("file:E:\\javafxworkspace\\lianxidemo\\src\\icon\\01.jpg"));

		anchorPane.getChildren().addAll(hBox,hBox2);
		AnchorPane.setLeftAnchor(hBox, 20.0);
		AnchorPane.setLeftAnchor(hBox2, 50.0);
		AnchorPane.setTopAnchor(hBox2, 100.0);


		stage.setScene(new Scene(anchorPane, 400, 500));
		stage.show();


		System.out.println("****************************************拖拽文字****************************************");
		//第一步：检测拖拽行为
		label.setOnDragDetected(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent event) {
				System.out.println("开始拖拽");
				//设置拖拽模式，这个不限制
				Dragboard db=label.startDragAndDrop(TransferMode.COPY);

				//截图
				Text text = new Text(label.getText());
				WritableImage wi=new WritableImage((int)label.getWidth(), (int)label.getHeight());
				text.snapshot(new SnapshotParameters(), wi);

				//设置拖拽时的图标
				db.setDragView(wi);

				//设置值到剪贴板
				ClipboardContent cc= new ClipboardContent();
				cc.putString(label.getText());
				//设置值
				db.setContent(cc);
			}
		});

		//第二步：设置文本框的拖过事件
		tf.setOnDragOver(new EventHandler<DragEvent>() {
			@Override
			public void handle(DragEvent event) {
				System.out.println("拖拽划过 文本框.");
				//这个方法必须调用，否则无法触发setOnDragDropped()事件
				event.acceptTransferModes(TransferMode.COPY);
			}
		});

		//拖拽完成
		tf.setOnDragDropped(new EventHandler<DragEvent>() {
			@Override
			public void handle(DragEvent event) {
				System.out.println("拖拽结束.");
				if(event.getTransferMode()==TransferMode.COPY){
					tf.setText(event.getDragboard().getString());

					//设置拖动完毕, 这步可以不写，如果不写的话， 则在label.setOnDragDone中调用event.getTransferMode()时返回null
					event.setDropCompleted(true);
				}
			}
		});

		//第四步：拖拽动作完成
		label.setOnDragDone(new EventHandler<DragEvent>() {
			@Override
			public void handle(DragEvent event) {
				System.out.println("event="+event + "   event.getTransferMode()="+event.getTransferMode());
				if(event.getTransferMode() == TransferMode.COPY){
					//清空label的值
					System.out.println("清空label的值");
					label.setText("");
				}
			}
		});





		System.out.println("****************************************拖拽图片文件****************************************");
		//第一步：点击时，先让控件获取焦点
		hBox2.setOnMouseClicked(new EventHandler<MouseEvent>() {
			@Override
			public void handle(MouseEvent event) {
				hBox2.requestFocus();
			}
		});


		//第二步：设置拖拽进入时，边框的颜色
		hBox2.setOnDragEntered(new EventHandler<DragEvent>() {
			@Override
			public void handle(DragEvent event) {
				hBox2.setBorder(new Border(new BorderStroke(Color.BLACK, BorderStrokeStyle.SOLID, new CornerRadii(0), new BorderWidths(2))));
			}
		});

		//第三步：设置拖拽退出控件时的边框颜色
		hBox2.setOnDragExited(new EventHandler<DragEvent>() {
			@Override
			public void handle(DragEvent event) {
				//去掉边框
				hBox2.setBorder(null);
			}
		});

		//第四步：拖拽到控件上方时触发
		hBox2.setOnDragOver(new EventHandler<DragEvent>() {
			@Override
			public void handle(DragEvent event) {
				event.acceptTransferModes(event.getTransferMode());
			}
		});

		//第五步：拖到到目标并松开时触发
		hBox2.setOnDragDropped(new EventHandler<DragEvent>() {
			@Override
			public void handle(DragEvent event) {
				System.out.println("==================");
				//拖拽文件到hbox2控件，会同时触发db.hasUrl()和db.hasFiles()
				try {
					Dragboard db = event.getDragboard();
					/*if (db.hasFiles()) {
						System.out.println("hasFiles");
						view.setImage(new Image(new FileInputStream(db.getFiles().get(0))));
					}*/
					if(db.hasUrl()){
						System.out.println("hasUrl" + db.getUrl());
						view.setImage(new Image(db.getUrl()));
					}
					if(db.hasImage()){
						System.out.println("hasImage");
						view.setImage(db.getImage());
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

	}


}
